package com.sy.olddriver.handler;

import com.sy.olddriver.annotations.RequestMapping;
import com.sy.olddriver.constant.AppConstant;
import com.sy.olddriver.dto.Result;
import com.sy.olddriver.entity.User;
import com.sy.olddriver.exception.OldDriverException;
import com.sy.olddriver.service.UserService;
import com.sy.olddriver.service.impl.UserServiceImpl;
import com.sy.olddriver.utils.HttpUtils;
import com.sy.olddriver.utils.ParamUtils;
import com.sy.olddriver.utils.RandomUtils;
import com.sy.olddriver.utils.RedisUtils;
import com.sy.olddriver.utils.SmsUtils;
import com.sy.olddriver.utils.ValidateCodeUtils;
import com.sy.olddriver.vo.RegistParam;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang.StringUtils;

/**
 * 用户模块处理器
 *
 * @author Administrator
 */
@RequestMapping("user")
public class UserHandler {
    private UserService userService = new UserServiceImpl();

    /**
     * 根据用户名获取用户信息
     *
     * @return 处理的结果
     */
    @RequestMapping("getUserByName")
    public Result getUserByName() {
        return userService.getUserByUserName(ParamUtils.getParam("userName"));
    }

    /**
     * 根据手机号获取用户信息
     *
     * @return 处理的结果
     */
    @RequestMapping("getUserByPhone")
    public Result getUserByPhone() {
        return userService.getUserByPhone(ParamUtils.getParam("phone"));
    }

    /**
     * 发送短信
     * @return 发送短信操作的返回结果
     */
    @RequestMapping("sendShortMessage")
    public Result sendShortMessage() {
        Result result = new Result();
        //生成随机验证码
        String code = ValidateCodeUtils.getRandomStr(AppConstant.SHORT_MESSAGE_VALIDATE_CODE_LENGTH);

        //将验证码的值存入Session中
        HttpUtils.setSessionAttribute(AppConstant.SHORT_MESSAGE_CODE_SESSION_NAME, code);

        //获取手机号
        String phone = ParamUtils.getParam("phone");
        if (StringUtils.isBlank(phone)) {
            result.setSuccess(false);
            result.setErrMsg("要发送的手机号不能为空");
            return result;
        }
        SmsUtils.sendMail(phone, code);
        return result;
    }

    /**
     * 注册操作
     *
     * @return 注册操作的结果
     */
    @RequestMapping("regist")
    public Result regist() {

        return userService.regist(ParamUtils.paramMap2Bean(RegistParam.class), String.valueOf(HttpUtils.getSessionAtrribute(AppConstant.SHORT_MESSAGE_CODE_SESSION_NAME)));
    }

    /**
     * 登录操作
     *
     * @return 登录操作的结果
     */
    @RequestMapping("login")
    public Result login() {
        //获取前端传过来的用户名和密码
        String userName = ParamUtils.getParam("userName");
        String userPwd = ParamUtils.getParam("userPwd");

        //调用登录操作的业务方法
        Result result = userService.login(userName, userPwd);
        //如果登录成功，此时需要保存用户的登录状态
        if (result.isSuccess()) {
            //1.在Cookie中保存当前客户端的登录后的凭证，名为token
            //(1)生成一个随机字符串作为凭证
            String token = RandomUtils.getRandomStr();
            //(2)将凭证存入Cookie
            HttpUtils.setCookie(AppConstant.USER_TOKEN_COOKIE_NAME, token, AppConstant.LOGIN_USER_VALID_TIME);

            //2.在Redis中存储用户的信息
            User user = (User) result.getData();
            String redisUserKey = AppConstant.USER_TOKEN_REDIS_PREFIX + token;
            if (!RedisUtils.set(redisUserKey, user)) {
                throw new OldDriverException("登录失败，请稍后重试");
            } else {
                RedisUtils.expire(redisUserKey, AppConstant.LOGIN_USER_VALID_TIME);
            }
        }
        return result;
    }

    /**
     * 判断用户是否已经登录（也可以用来获取登录的用户信息）
     *
     * @return 登录用户的信息
     */
    @RequestMapping("loginUser")
    public Result getLoginUser() {
        Result result = new Result();
        User user = HttpUtils.getLoginUser();
        if (null == user) {
            result.setSuccess(false);
            result.setErrMsg("用户尚未登录");
        } else {
            result.setData(user);
        }
        return result;
    }

    /**
     * 登出操作
     *
     * @return 登出操作的结果
     */
    @RequestMapping("logout")
    public Result logout() {
        Result result = new Result();
        try {
            //先将token存下，防止删除对应Cookie后无法再次获取
            String token = HttpUtils.getCookie(AppConstant.USER_TOKEN_COOKIE_NAME);
            //删除Cookie中的token
            HttpUtils.delCookie(AppConstant.USER_TOKEN_COOKIE_NAME);
            //删除token在Redis中对应的key
            String redisUserKey = AppConstant.USER_TOKEN_REDIS_PREFIX + token;
            if (!RedisUtils.del(redisUserKey)) {
                throw new OldDriverException("登出失败！");
            }
        } catch (OldDriverException e) {
            e.printStackTrace();
            result.setSuccess(false);
            result.setErrMsg(e.getMessage());
        }
        return result;
    }

    /**
     * 更新用户信息
     *
     * @return 更新用户信息的操作结果
     */
    @RequestMapping("updateInfo")
    public Result updateInfo() {
        //获取前端传过来的要更新的值以及要更新的类型
        String content = ParamUtils.getParam("content");
        String updateType = ParamUtils.getParam("updateType");
        Integer userId = HttpUtils.getLoginUser().getId();
        return userService.updateUser(content, updateType, userId);
    }

    /**
     * 获取用户信息
     *
     * @return 获取用户信息的操作结果
     */
    @RequestMapping("getUserInfo")
    public Result getUserInfo() {
        //获取Redis中当前的登录用户
        User loginUser = HttpUtils.getLoginUser();
        return userService.getUserInfo(loginUser.getId());
    }
}
